package com.pattern.singleton;

/**
 * 静态内部类的方式
 * JVM保证单例
 * 加载外部类时不会加载内部类 这样可以保证实现懒加载
 *
 * 与 Mgr01 比较
 *      Mgr01被类加载器加载后就会产生实例
 *      Mgr07被类加载器加载时 静态内部类是不会被加载的  只有调用静态内部类中的方法getInstance 才会被加载
 *  ---- JVM加载类的时候只会被加载一次 所以保证单例的
 *
 *  这种方式比较完美的
 */
public class Mgr07 {

    private Mgr07(){
    }

    /**
     * 静态内部类
     */
    private static class Mgr07Holder {
        private static final Mgr07 INSTANCE = new Mgr07();
    }

    public static Mgr07 getInstance() {
        return new Mgr07Holder().INSTANCE;
    }

    public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        for(int i = 0; i < 100; i++){
            new Thread(() -> {
                System.out.println(Mgr07.getInstance().hashCode());
            }).start();
        }
        Long end = System.currentTimeMillis();
        System.out.println("mill: " + (end - start));
    }
}

